﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Diagnostics;

namespace Cataloger
{
    /// <summary>
    /// Abstrakcyjna klasa okreslajaca obiekt dyskowy (Plik, Folder)
    /// Stworzona ze względu na fakt, iż Pliki i Foldery mają dużo wspólnych właściwości
    /// pól oraz metod, i sensownym wydawało się stworzenie dobrego szkieletu do rozszerzania
    /// dla Pliku i Folderu
    /// </summary>
    [Serializable]
    public abstract class ObiektDyskowy
    {
		#region Fields (11) 

        protected FileAttributes atrybuty;
        protected DateTime dataDost;
        protected DateTime dataMod;
        protected DateTime dataUtw;
        protected bool dodatkoweInfo;
        protected string nazwaAlias;
        protected Nosnik nosnik;
        protected string opis="";
        protected long rozmiar;
        protected string sciezka;

		#endregion Fields 

		#region Properties (15) 

        public FileAttributes Atrybuty
        {
            get { return atrybuty; }
        }

        public DateTime DataDost
        {
            get { return dataDost; }
        }

        public DateTime DataMod
        {
            get { return dataMod; }
        }

        public DateTime DataUtw
        {
            get { return dataUtw; }
        }

        public Katalog KataloG
        {
            get
            {
                return this.nosnik.Katalog;
            }
        }

        public bool MoznaOtworzyc
        {
            get { return nosnik.CzyPodlaczony(); }
        }

        public string Nazwa
        {
            get { return Path.GetFileName(sciezka); }
        }

        public string NazwaAlias
        {
            get { return nazwaAlias; }
            set { nazwaAlias = value; }
        }

        public Nosnik Nosnik
        {
            get { return nosnik; }
            set { nosnik = value; }
        }

        public string Opis
        {
            get { return opis; }
            set { opis = value; }
        }

        public string Rodzic
        {
            get { return Path.GetDirectoryName(sciezka); }
        }

        public Folder Root
        {
            get
            {
                return this.nosnik.Root;
            }
        }

        abstract public long Rozmiar
        {
            get;
        }

        public string Rozszerzenie
        {
            get { return Path.GetExtension(sciezka); }
        }

        public string Sciezka
        {
            get { return sciezka; }
        }

		#endregion Properties 

		#region Methods (5) 

		// Public Methods (5) 

        public virtual string CalkowiteInfo()
        {
            StringBuilder st = new StringBuilder();
            st.AppendLine("Nazwa: \t" + this.Nazwa);
            st.AppendLine("Sciezka: \t" + this.sciezka);
            st.AppendLine("Rozmiar: \t" + this.rozmiar.ToProperUnit());
            st.AppendLine("Data utw: \t" + this.dataUtw.ToShortDateString() + "  " + this.dataUtw.ToShortTimeString());
            st.AppendLine("Data mod: \t" + this.dataMod.ToShortDateString() + "  " + this.dataMod.ToShortTimeString());
            st.AppendLine("Data dos: \t" + this.dataDost.ToShortDateString() + "  " + this.dataDost.ToShortTimeString());
            st.AppendLine("Atrybuty: \t" + this.atrybuty.ToString());
            st.AppendLine("Nosnik: \t" + this.Nosnik.Nazwa);
            st.AppendLine("Katalog: \t" + this.KataloG.Nazwa);

            return st.ToString();
        }

        public override string ToString()
        {
            return Sciezka;
        }

        public bool Uruchom()
        {
            if (this.nosnik.CzyPodlaczony())
            {
                Process.Start(Path.Combine(nosnik.NazwaNapedu().Name.Substring(0,3),this.sciezka.Substring(3)));
                return true;
            }
            else
            {
                //dany dysk nie podlaczony
                return false;
            }
        }

        public bool UruchomFolder()
        {
            if (this.nosnik.CzyPodlaczony())
            {
                
                
                Process.Start(Path.GetDirectoryName(Path.Combine(nosnik.NazwaNapedu().Name.Substring(0,3),this.sciezka.Substring(3))));
                return true;
            }
            else
            {
                //dany dysk nie podlaczony
                return false;
            }
        }

        virtual public void  UstawKategorie(Kategoria kat)
        {
            
        }

		#endregion Methods 
    }
}
